/**
 * @ProjectName: go-learn-demo
 * @PackageName: ginybxb
 * @Description: 测试中间件的Next方法
 * @Author: hy.bai
 * @Date: 2025-08-03 16:49
 */
package ginybxb

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)

// 测试中间件的调用链

// Next()方法是gin.Context对中的方法。

// 定义一个中间件函数
func YbxbMiddleware1() gin.HandlerFunc {
	// 外边的代码会在web服务启动时，执行
	fmt.Println("我是一个中间件-YbxbMiddleware1")
	return func(ctx *gin.Context) {
		fmt.Println("YbxbMiddleware1中间件,调用Next方法之前----")
		ctx.Next() // 调用Next方法：Next方法的作用是调用下一个中间件或请求处理方法。
		fmt.Println("YbxbMiddleware1中间件,调用Next方法之后----")
	}
}

// 定义一个中间件函数
func YbxbMiddleware2() gin.HandlerFunc {
	// 外边的代码会在web服务启动时，执行
	fmt.Println("我是一个中间件-YbxbMiddleware2")
	return func(ctx *gin.Context) {
		fmt.Println("YbxbMiddleware2中间件,调用Next方法之前----")
		ctx.Next() // 调用Next方法：Next方法的作用是调用下一个中间件或请求处理方法。
		// ctx.Abort() // 调用Abort方法：Abort方法作用是中断当前请求的处理，并返回响应。
		fmt.Println("YbxbMiddleware2中间件,调用Next方法之后----")
	}
}

// hello请求的处理函数
func handlerHello(context *gin.Context) {
	fmt.Println("执行handlerHello方法~~~")
	context.JSON(http.StatusOK, gin.H{"code": 200, "msg": "hello world"})
}

// 测试中间件的执行顺序
func TestMiddleWareNext() {

	// 1.初始化gin对象
	r := gin.Default()

	// 注册中间件
	r.Use(YbxbMiddleware1(), YbxbMiddleware2())

	// 2.注册服务
	r.GET("/hello", handlerHello)

	// 3.启动服务
	r.Run(":8080")

}
